#ifndef __TERRAIN_H
#define __TERRAIN_H


/**
 * @file "terrain.h"
 * @author FARGIER Margot, FAURE Adrien
 * @brief définitions des structures et déclarations des fonctions et procedure utile pour la map
*/


/**
 * @brief une case contient les différents composants du terrain
*/
typedef enum {herbe,terre,vide} Case;


/**
 * @brief structure contenant les elements utile à la genération du terrain
*/
typedef struct sTerrain {
  int dimX;
  int dimY;
  Case **tabCases;
} Terrain;


/**
 * @brief procédure qui initialise un terrain en l'allouant dynamiquement en mémoire avec des valeurs qui seront lue dans un fichier dont le nom est passé en paramètre.
 * @param[in-out] Terrain *
 * @param[in] const char * nom du fichier contenant le terrain à initialiser
 * @return none
*/
void terrainInit (Terrain *, const char *);



/**
 * @brief procédure qui testamente un terrain, en le libérant de la mémoire.
 * @param[in-out] Terrain *
 * @return none
*/
void terrainLibere(Terrain * );


/**
 * @brief accesseur,fonction qui renvoie la dimension dimX du Terrain passé en paramètre
 * @param[in] Terrain *
 * @return int
*/
int terrainGetX(const Terrain *);

/**
 * @brief accesseur, fonction qui renvoie la dimension dimY du Terrain passé en paramètre
 * @param[in] Terrain *
 * @return int
*/
int terrainGetY(const Terrain *);

/**
 * @brief accesseur, fonction qui renvoie la case du Terrain dont les coordonnées sont passées en paramètre
 * @param[in] Terrain *
 * @param[in] int
 * @param[in] int
 * @return Case
*/
Case terrainGetCase(const Terrain *, int, int);


/**
 * @brief mutateur, procédure qui modifie la dimension dimX du Terrain en la dimension passée en paramètre
 * @param[in-out] Terrain *
 * @param[in] int
 * @return none
*/
void terrainSetX(Terrain *, int);

/**
 * @brief mutateur, procédure qui modifie la dimension dimY du Terrain en la dimension passée en paramètre
 * @param[in-out] Terrain *
 * @param[in] int
 * @return none
*/
void terrainSetY(Terrain *,int);

/**
 * @brief procédure qui modifie la case du Terrain dont les coordonnées sont passées en paramètre avec la Case passée en paramètre.
 * @param[in-out] Terrain *
 * @param[in] int
 * @param[in] int
 * @param[in] Case
 * @return none
*/
void terrainSetCase(Terrain *, int, int, Case);


/**
 * @brief renvoie 1 si la position x,y (passés en paramètres) est valide, 0 sinon
 * @warning la variable jeu doit imperativement etre initialisée
 * @return entier 0 ou 1
*/
int terrainPositionValide(Terrain * , int , int);


#endif
